package com.demo.designmode.proxy.dynamic.jdk;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @Author: jxm
 * @Description: 代理工厂，用来创建代理对象
 * @Date: 2024-1-11 10:38
 * @Version: 1.0
 */
public class ProxyFactory {

    private SellTickets station;

    public ProxyFactory(SellTickets station){
        this.station = station;
    }

    public Object getProxyObject(){

        /**
         * 使用Proxy获取代理对象
         *      newProxyInstance()方法参数说明：
         *          ClassLoader loader ： 类加载器，用于加载代理类，使用真实对象的类加载器即可
         *          Class<?>[] interfaces ： 真实对象所实现的接口，代理模式真实对象和代理对象实现相同的接口
         *          InvocationHandler h ： 代理对象的调用处理程序
         *
         */
        Object sellTickets = Proxy.newProxyInstance(station.getClass().getClassLoader(),
                station.getClass().getInterfaces(),
                new InvocationHandler() {
                    /**
                     * InvocationHandler中invoke方法参数说明：
                     * @param proxy 代理对象
                     * @param method 对应于在代理对象上调用的接口方法的 Method 实例
                     * @param args 代理对象调用接口方法时传递的实际参数
                     * @return
                     * @throws Throwable
                     */
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代理点收取一些服务费用(JDK动态代理方式)");
                        //执行真实对象
                        Object result = method.invoke(station, args);
                        return result;
                    }
                });

        return sellTickets;
    }

}
